La programación orientada a objetos utiliza un vocabulario especial donde encontramos: clase, objeto y método. Nuestro objetivo es dar una definición simplificada de los tres conceptos.
Lo más importante: una clase es un tipo. Hasta ahora quizás has trabajado con variables int, float, char o bool. Todos ellos son tipos, y todas las variables tienen un tipo. Lo que sabemos hasta ahora es que para almacenar un dato en un programa hay que declarar una variable y que todas las variables (en C++) tienen un tipo.
Pues bien, los siguientes tipos: int, char, float, double y bool se denominan tipos integrados. Estos tipos forman parte del lenguaje C++ de orígen. Quizás habrás notado que en la lista falta string. Es deliberado: resulta que string no es un tipo integrado, string es una clase.
Y qué quiere decir eso? Pues que es un tipo, pero que no forma parte del núcleo del lenguaje. Lo podríamos haber programado nosotros (aprenderemos cómo más adelante). Si sabes como declarar una tupla, entonces sabes que puedes declarar tipos hechos por tí. Si no, no te preocupes.
La cuestión es que hasta ahora, si escribíamos:
string s;
pensábamos que declarábamos una variable s de tipo string. Ahora simplemente vamos a cambiar un poco la forma de hablar. Diremos que s es un objeto de la clase string. Ya hemos visto que string es una clase. Solo falta decir, entonces, que las variables de un tipo que es una clase se llaman objetos. Claro, de objetos puede haber muchos:
string s, t, u, v, w, x, y, z;
pero de clase solo hay una. Se entiende hasta aquí, no?
Claro, si sólo fuera eso, entonces es únicamente un cambio de lenguaje... pero hay más. La distinción principal entre los tipos integrados y las clases es el hecho de que las clases tienen métodos. Un método es, simplemente, una función (o acción) asociada a una clase. Se dice que un método pertenece a una clase, o también que es una función miembro. Esto tiene consecuencias importantes.
El hecho de que los métodos pertenezcan a una clase implica que debemos llamarlos de una forma distinta. Por ejemplo, para averiguar el tamaño (la longitud) de un string, existe el método size. Para determinar el tamaño de un objeto s de la clase string, haríamos, entonces:
int tam; tam = s.size();
Aquí es donde está la parte más importante de la lección (línea 2, después del =): en la forma de invocar el método. Si te fijas, hay que escribir s.size(), donde aparece el objeto al principio (s), seguido de un punto, y luego la llamada como si fuera una función normal (size no tiene parámetros y por tanto se ponen los dos paréntesis juntos). Si has visto tuplas, reconocerás el punto como la forma de acceder a los campos. La llamada s.size() se debe leer como: invocamos el método size sobre el objeto s.
Lo importante de la llamada es que los métodos siempre se invocan sobre objetos. Es decir que un método es una función que siempre modifica o consulta los datos de algún objeto. Siempre. En el ejemplo previo, el método size determina el tamaño. Pero de quién? Pues del objeto s. Si el método size pertenece a la clase string entonces cuando se invoca nos devuelve el tamaño de cierto objeto de esa clase. Se puede hacer una analogía lingüística: si s.size() es una "frase", s es el "sujeto" y size es el "verbo".
Claro, entonces si tenemos varios objetos de tipo string:
string s, r;
podemos averiguar el tamaño de cualquiera de ellos invocando al método sobre el objeto que nos interese:
cout << "El tamaño de 's' es: " << s.size() << endl; cout << "El tamaño de 'r' es: " << r.size() << endl;
En preparación